﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using TCC_Hotel.Entidades;
using TCC_Hotel.Serviços.BDServices;
using TCC_Hotel.Serviços.OtherServices;

namespace TCC_Hotel.Apresentacao.Vendas
{
    public partial class CadastrarVendas : System.Web.UI.Page
    {
        EstoqueService servico_Estoque = new EstoqueService();
        ApartamentoService servico_Apartamento = new ApartamentoService();
        ContaService servico = new ContaService();


        /// <summary>
        /// Carregamento da página
        /// </summary>
        protected void Page_Load(object sender, EventArgs e)
        {
            //Recupera o usuario corrente
            string usuario = Request.ServerVariables["AUTH_USER"].ToString();
            LoginService servico_Login = new LoginService();
            //Verifica permissao ao acesso da página
            if (!servico_Login.RecuperarPermissaoCache(usuario).Cadastrar_Vendas)
            {
                //Redireciona para a pagina inicial
                Response.Redirect("~/");
            }


            if (!IsPostBack)
            {
                //limpa o chaches existentes para pegar os dados mais atualizados
                HttpContext.Current.Cache.Remove("Lista_Apartamentos");
                HttpContext.Current.Cache.Remove("Lista_Fluxo_Hospedes_Agora");
                HttpContext.Current.Cache.Remove("Lista_Produtos_Estoque");
                HttpContext.Current.Cache.Remove("Lista_Produtos");
                HttpContext.Current.Cache.Remove("Lista_Venda_Ativo");

                List<int> listaApartamentosOcupados = servico_Apartamento.RecuperarApartamentosOcupados();

                //popular o dropdown apartamentos
                ddlApartamentos.DataSource = listaApartamentosOcupados;
                ddlApartamentos.DataBind();

                //Chama serviço que retorna todos os produtos
                List<Produto> produtos = servico_Estoque.ListarProdutosDisponiveisCache();

                //popular o dropdown produtos
                ddlProdutos.DataSource = produtos.OrderBy(i => i.NomeProduto).ToList();
                ddlProdutos.DataTextField = "NomeProduto";
                ddlProdutos.DataValueField = "ID";
                ddlProdutos.DataBind();

                //carrega as vendas do apartamento
                int apartamento;
                int.TryParse(ddlApartamentos.SelectedValue, out apartamento);
                List<Conta> vendas = servico.RecuperarVendasProdutoFluxo(apartamento);

                ReloadGridView();

            }
        }

        /// <summary>
        /// Evento de mudança de texto do campo de quantidade. Calcula o preço e coloca no campo 
        /// correto.
        /// </summary>
        protected void txtQuantidade_TextChanged(object sender, EventArgs e)
        {
            int produto, quantidade;
            int.TryParse(ddlProdutos.SelectedValue, out produto);
            int.TryParse(txtQuantidade.Text, out quantidade);

            txtPreco.Text = String.Format("{0:0.00}", servico.CalcularPreco(produto, quantidade));
        }


        /// <summary>
        /// Evento de mudança de apartamento. Deve se recarregar a lista
        /// </summary>
        protected void ddlApartamentos_SelectedIndexChanged(object sender, EventArgs e)
        {
            //carrega as vendas do apartamento
            ReloadGridView();


        }

        /// <summary>
        /// Evento de mudança de item no ddl de produtos
        /// </summary>
        protected void ddlProdutos_SelectedIndexChanged(object sender, EventArgs e)
        {
            int produto, quantidade;
            int.TryParse(ddlProdutos.SelectedValue, out produto);
            if (!int.TryParse(txtQuantidade.Text, out quantidade))
            {
                return;
            }

            txtPreco.Text = String.Format("{0:0.00}", servico.CalcularPreco(produto, quantidade));

        }

        /// <summary>
        /// Evento de click do botão cadastrar
        /// </summary>
        protected void btnCadastrar_Click(object sender, EventArgs e)
        {
            
            ComumServices comum = new ComumServices();

            //preenche a lista obrigatoria para verificar se todos os campos obrigatorios foram preenchidos
            List<string> listaObrigatoria = new List<string>() 
            { 
                txtQuantidade.Text.Trim()
            };

            //verifica se algum campo obrigatorio nao foi preenchido
            if (!comum.ValidaCamposObrigatorios(listaObrigatoria))
            {
                MensagemJS("ERRO: Campo obrigatório em branco");
                return;
            }
           
            //recupera o conteudo dos textsbox
            int apartamento = Convert.ToInt32(ddlApartamentos.SelectedValue);
            int idProduto = Convert.ToInt32(ddlProdutos.SelectedValue);
            int quantidade = Convert.ToInt32(txtQuantidade.Text);
            bool jaEfetuado = cknPagamento.Checked;
            double preco = Convert.ToDouble(txtPreco.Text);

            if (quantidade < 1)
            {
                MensagemJS("Quantidade não pode ser zero!");
                return;
            }
            //Chama serviço que retorna todos os produtos
            int qntEstoque= servico_Estoque.ListarProdutosDisponiveisCache().Where(i=>i.ID == idProduto).FirstOrDefault().QuantidadeEstoque;

            if (quantidade > qntEstoque)
            {
                MensagemJS("Quantidade não disponível no estoque!");
                return;
            }

            //chama o serviço que insere a conta
            int respostaCadastro = servico.CadastrarVenda(apartamento, idProduto, quantidade, jaEfetuado, preco);
            if (respostaCadastro == 1)
            {
                PosCadastro();
                MensagemJS("Venda cadastrada com sucesso!");

            }
            else if (respostaCadastro == 2)
            {
                PosCadastro();
                MensagemJS("Venda cadastrada e SMS enviado com sucesso!");
            }
            else if (respostaCadastro == 3)
            {
                PosCadastro();
                MensagemJS("Venda cadastrada mas houve um erro no envio do SMS!");
            }

            else 
            {
                MensagemJS("Occoreu um erro!!");
                return;
            }

        }

        /// <summary>
        /// Chamado apó o cadastro da venda
        /// </summary>
        public void PosCadastro()
        {
            //Apaga os text box
            txtPreco.Text = null;
            txtQuantidade.Text = null;
            cknPagamento.Checked = false;

            //limpa os caches para buscar a nova alteração
            HttpContext.Current.Cache.Remove("Lista_Produtos_Estoque");
            HttpContext.Current.Cache.Remove("Lista_Produtos");
            HttpContext.Current.Cache.Remove("Lista_Venda_Ativo");

            //Refresh na tela
            ReloadGridView();

        }

        /// <summary>
        /// Lança um popup em javaScript com alguma mensagem
        /// </summary>
        /// <param name="msg">Mensagem do popup</param>
        public void MensagemJS(string msg)
        {
            //Formata um alert para o usuário
            ScriptManager.RegisterStartupScript(this,

                    this.GetType(),

                    "Mensagem",

                    string.Format("alert" + "('" + msg + "')"),

                    true);

        }

        /// <summary>
        /// Evento de click em algum dos botões 
        /// </summary>
        protected void grdVendas_RowCommand(object sender, GridViewCommandEventArgs e)
        {

            //Verifica qual o botão que o usuário clicou
            if (e.CommandName == "cancelarVenda")
            {
                DateTime dataVenda = Convert.ToDateTime(grdVendas.Rows[Convert.ToInt16(e.CommandArgument)].Cells[2].Text);
                string descricao = Server.HtmlDecode(grdVendas.Rows[Convert.ToInt16(e.CommandArgument)].Cells[0].Text);
                double preco = Convert.ToDouble(grdVendas.Rows[Convert.ToInt16(e.CommandArgument)].Cells[1].Text.Substring(3));
                int apartamento = Convert.ToInt32(ddlApartamentos.SelectedValue);

                int resposta = servico.CancelarVenda(dataVenda, descricao, preco, apartamento);
                if (resposta == 1)
                {
                    PosCadastro();
                    MensagemJS("Venda cancelada com sucesso!");

                }
                else if (resposta == 2)
                {
                    PosCadastro();
                    MensagemJS("Venda cancelada e SMS enviado com sucesso!");
                }
                else if (resposta == 3)
                {
                    PosCadastro();
                    MensagemJS("Venda cancelada mas houve um erro no envio do SMS!");
                }
                else
                {
                    MensagemJS("Occoreu um erro!!");
                    return;
                }

            }
        }

        /// <summary>
        /// Evento que controla a paginação e verifica o cache
        /// </summary>
        protected void grdVendas_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            //carrega as vendas do apartamento
            int apartamento;
            int.TryParse(ddlApartamentos.SelectedValue, out apartamento);
            List<Conta> vendas = servico.RecuperarVendasProdutoFluxo(apartamento);

            //Na mudança de pagina, chama o evento de aparecer a lista
            grdVendas.PageIndex = e.NewPageIndex;

            //popular gridView
            grdVendas.DataSource = vendas.OrderByDescending(i => i.Data).ToList();
            grdVendas.DataBind();
        }

        /// <summary>
        /// Eveneto que verifica se ja foi efetuado o pagamento,
        /// se sim, desabilita o botão de cancelar
        /// </summary>
        protected void grdVendas_RowDataBound(object sender, GridViewRowEventArgs e)
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                string venda = DataBinder.Eval(e.Row.DataItem, "Descricao").ToString();
                ((LinkButton)e.Row.Cells[4].Controls[0]).OnClientClick = "return confirm('Deseja realmente cancelar a venda de " + venda + "');";

            }
        }
        /// <summary>
        /// Faz o reload do gridview quando necessário e consulta o cache
        /// </summary>
        private void ReloadGridView()
        {
            //carrega as vendas do apartamento
            int apartamento;
            int.TryParse(ddlApartamentos.SelectedValue, out apartamento);
            List<Conta> vendas = servico.RecuperarVendasProdutoFluxo(apartamento);

            //popular gridView
            grdVendas.DataSource = vendas.OrderByDescending(i => i.Data).ToList();
            grdVendas.DataBind();

            //verifica se ja houve vendas, se não ele mostra um aviso
            if (vendas.Count == 0)
            {
                lblAvisoNaoVendas.Visible = true;
            }
            else
            {
                lblAvisoNaoVendas.Visible = false;
            }

            //Chama serviço que retorna todos os produtos
            List<Produto> produtos = servico_Estoque.ListarProdutosDisponiveisCache();

            //popular o dropdown produtos
            ddlProdutos.DataSource = produtos.OrderBy(i => i.NomeProduto).ToList();
            ddlProdutos.DataTextField = "NomeProduto";
            ddlProdutos.DataValueField = "ID";
            ddlProdutos.DataBind();

            //coloca o número do apartamento
            lblNumeroApartamento.Text = apartamento.ToString();
        }

    }
}